package com.funtl.framework.java.orm.hibernate.service;

import java.util.List;
import java.util.Map;

import org.springframework.orm.hibernate3.HibernateTemplate;

import com.funtl.framework.java.abstracts.AbstractEntity;
import com.funtl.framework.java.exception.DaoException;

public interface IHibernateDao {
	/**
	 * 清除缓存
	 * @param entity
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void clearCatch(Class<T> clazz) throws DaoException;
	
	/**
	 * 删除
	 * @param entity
	 * @param fieldName 要删除的字段属性名称
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void delete(T entity, String fieldName) throws DaoException;
	
	/**
	 * 直接执行SQL语句，如删除或更新等操作
	 * @param sql
	 * @param params 这里为赋值数组，使用“？”填充的值均可在此使用
	 * @return
	 * @throws DaoException
	 */
	public boolean excuteSQL(String sql, String[] params) throws DaoException;
	
	/**
	 * 根据条件获取对象，该方法可根据自定义参数对象HibernateParam自由组合条件
	 * @param entity
	 * @param param
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity, V> V get(T entity, HibernateParam param) throws DaoException;
	
	/**
	 * 根据条件获取对象
	 * 该方法可根据实体对象提供的有值属性获取对应实体类
	 * @param entity 实体类
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> T getByEntity(T entity) throws DaoException;
	
	/**
	 * 获取总笔数
	 * @param entity
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> long getCount(T entity) throws DaoException;
	
	/**
	 * 根据条件获取总笔数，该方法可根据自定义参数对象HibernateParam自由组合条件
	 * @param entity
	 * @param param
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> long getCount(T entity, HibernateParam param) throws DaoException;
	
	/**
	 * 根据实体类属性的值获取数据总笔数
	 * @param entity
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> long getCountByEntity(T entity) throws DaoException;
	
	/**
	 * 根据条件获取集合，该方法可根据自定义参数对象HibernateParam自由组合条件 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param param
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity, V> List<V> getList(T entity, HibernateParam param, String... order) throws DaoException;
	
	/**
	 * 获取全部对象 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getList(T entity, String... order) throws DaoException;
	
	/**
	 * 根据实体类属性的值查询结果集
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity 实体类
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getListByEntity(T entity, String... order) throws DaoException;
	
	/**
	 * 使用二级缓存获取集合，该方法可根据自定义参数对象HibernateParam自由组合条件 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param param
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity, V> List<V> getListByEhcatch(T entity, HibernateParam param, String... order) throws DaoException;
	
	/**
	 * 使用二级缓存获取全部对象<br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC <br />
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getListByEhcatch(T entity, String... order) throws DaoException;
	
	/**
	 * 使用SQL语句查询结果集，返回Map集合，取值时直接map.get('数据库中的字段名称')
	 * @param sql
	 * @return
	 * @throws DaoException
	 */
	public List<Map<String, Object>> getListBySQL(String sql) throws DaoException;
	
	/**
	 * 使用SQL语句查询结果集，返回Map集合，取值时直接map.get('数据库中的字段名称')
	 * @param sql
	 * @param params 这里为赋值数组，使用“？”填充的值均可在此使用
	 * @return
	 * @throws DaoException
	 */
	public List<Map<String, Object>> getListBySQL(String sql, String[] params) throws DaoException;
	
	/**
	 * 分页功能的数据集合，该方法可根据自定义参数对象HibernateParam自由组合条件 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param param
	 * @param pageIndex
	 * @param pageSize
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getPagingList(T entity, HibernateParam param, int pageIndex, int pageSize, String... order) throws DaoException;
	
	/**
	 * 分页功能的数据集合 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param pageIndex
	 * @param pageSize
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getPagingList(T entity, int pageIndex, int pageSize, String... order) throws DaoException;
	
	/**
	 * 根据实体类属性的值查询分页结果集
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity 实体类
	 * @param pageIndex
	 * @param pageSize
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getPagingListByEntity(T entity, int pageIndex, int pageSize, String... order) throws DaoException;
	
	/**
	 * 分页功能的二级缓存集合，该方法可根据自定义参数对象HibernateParam自由组合条件 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity 实体类
	 * @param param
	 * @param pageIndex
	 * @param pageSize
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity, V> List<V> getPagingListByEhcatch(T entity, HibernateParam param, int pageIndex, int pageSize, String... order) throws DaoException;
	
	/**
	 * 分页功能的二级缓存集合 <br />
	 * 排序参数用法 "fieldName", "ASC", "fieldName", "DESC"
	 * @param entity
	 * @param pageIndex
	 * @param pageSize
	 * @param order 排序字段，如果不用排序该值可不填，需要排序则必须加入排序方式ASC/DESC
	 * @return
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> List<T> getPagingListByEhcatch(T entity, int pageIndex, int pageSize, String... order) throws DaoException;
	
	/**
	 * 增加
	 * @param entity
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void insert(T entity) throws DaoException;
	
	/**
	 * 批量增加
	 * @param list
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void insertAll(List<T> list) throws DaoException;
	
	/**
	 * 增加或是更新，如果数据库有内容则更新否则新增
	 * @param entity
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void insertOrUpdate(T entity) throws DaoException;
	
	/**
	 * 批量增加或是更新，如果数据库有内容则更新否则新增
	 * @param list
	 * @throws DaoException
	 */
	public <T extends AbstractEntity> void insertOrUpdate(List<T> list) throws DaoException;
	
	/**
	 * 更新
	 * @param entity
	 * @throws DaoException
	 */
	public<T extends AbstractEntity> void update(T entity) throws DaoException;
	
	public HibernateTemplate hibernateTemplate();
}
